/*
 * keyboard.h
 *
 *  Created on: 2016年7月27日
 *      Author: pengzhikang
 */

#ifndef _KEYBOARD_H
#define _KEYBOARD_H 1

#define PORT_KEYDAT				0x0060			/* i8042的数据端口号 */
#define PORT_KEYSTA				0x0064			/* i8042的状态端口号 */
#define PORT_KEYCMD				0x0064			/* i8042的命令端口号 */
/* 事实上状态端口和命令端口是同一个端口
 只是作者定义了两个不同的符号常量名 */
#define KEYSTA_SEND_NOTREADY	0x02			/* 这个符号常量用来判断i8042的输入缓冲区是否满 */
#define KEYCMD_WRITE_MODE		0x60			/* 发送给i8042的命令 下面有详细解释 */
#define KBC_MODE				0x47			/* 将被设置为i8042的控制寄存器的值 */
#define KEYCMD_LED 0xed //向键盘发送数据的前两个字节

#define KEYCMD_SENDTO_MOUSE		0xd4
#define MOUSECMD_ENABLE			0xf4	/* 该命令可以允许鼠标向主机发送数据包 */

#define CURSOR_FLASH 2 //光标闪烁
#define CURSOR_NOT_FLASH 3//光标不闪烁

#include "fifo.h"

/**
 *  鼠标缓冲区结构
 *
 *	buf[]是缓冲区,存放鼠标发送过来的3字节数据
 *	phase用来标识接收到鼠标数据的第几步
 *	x, y存放鼠标位移量	bth记录按键信息
 */
struct MOUSE_DEC {
	unsigned char buf[3], phase;
	int x, y, btn;
};

void inthandler2c(int *esp);
void enable_mouse(struct FIFO32 *fifo, int data0, struct MOUSE_DEC *mdec);
int mouse_decode(struct MOUSE_DEC *mdec, unsigned char dat);

void inthandler21(int *esp);
void wait_KBC_sendready(void);
void init_keyboard(struct FIFO32 *fifo, int data0);

#endif
